const Koa = require('koa');
const path = require('path'); // 引入路径模块
const helmet = require('koa-helmet'); // 引入 koa-helmet
const koaLogger = require('koa-logger'); // 引入 koa-logger
const { koaBody} = require('koa-body'); // 引入 koa-body
const koaStatic = require('koa-static'); // 引入 koa-static
// const bodyParser = require('koa-bodyparser'); // 引入 koa-bodyparser
const errorHandler = require('./middleware/errorHandler');

const router = require('@/router');
const { sequelize } = require('@/model');
const authCheck = require('./middleware/authCheck');
// const router = require('./router/index.js');
// 白名单：不需要 token 验证的路由前缀
const PUBLIC_ROUTES = ['/user/login', '/user/register']
const app = new Koa();
// 设置proxy为true 表示支持代理的 HTTP 请求头字段名是 X-Forwarded-Host 获取请求的主机名
app.proxy = true;
require('@/model');  // 引入模型
// require('@/model/associations');
try {
  sequelize.authenticate(); // 测试数据库连接
  console.log('Connection has been established successfully.');
} catch (error) {
  console.error('Unable to connect to the database:', error);
}

app.use(koaBody(
  {
    multipart: true, // 支持文件上传
    formidable: {
      // uploadDir: path.join(__dirname, './upload/local'), // 设置文件上传目录
      keepExtensions: true, // 保留文件扩展名
      multiples: true, // 允许上传多个文件
      maxFileSize: 200 * 1024 * 1024, // 文件大小限制 200M
      onFileBegin: (name, file) => {
        console.log('文件开始上传', name, file);
      },
    },
  },
)); // 使用 koa-body 解析请求体
app.use(helmet()); // 使用 koa-helmet 保护应用程序
app.use(koaLogger()); // 使用 koa-logger 打印请求日志

app.use(koaStatic(path.join(__dirname, './upload'))); // 静态文件服务 koa-static 用于读取静态文件
app.use(errorHandler); // 错误处理中间件 必须在路由之前使用
app.use(async (ctx, next) => {
  const isPublicRoute = PUBLIC_ROUTES.some(route => ctx.path.startsWith(route))
  if (isPublicRoute) {
    await next()
  } else {
    await authCheck(ctx, () => next())
  }
})
app.use(router.routes(), router.allowedMethods()); // 使用路由

// 全局错误监听
app.on('error', (err, ctx) => {
  console.error('Global Error:', {
    url: ctx.url,
    method: ctx.method,
    body: ctx.request.body,
    error: err.message
  });
});

module.exports = app;